library(rvest)
library(dplyr)
library(rgdal)
library(ggplot2)
library(sf)
library(stringr)
library(lubridate)
library(readr)
library(tm)
library(wordcloud)
library(cowplot)
library(stargazer)
library(knitr)
#ode ide inace skrep ali sad samo vadimo csv
podaci = read_csv("/Users/perica/Desktop/PODACI.csv")
kable(podaci[1:5,])
| …1 | lokacija | naslov | cijena | kvadratura | objekt | sobe | opis | kvadrat | datumi | županija |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Bakar | Stan Bakar 1S+DB - 66m2, stan s terasom i potkrovljem | 100000 | 66.00 | U stambenoj zgradi | 1s-1s+DB | Prodaje se stan u Bakru površine 66 m2.Stan se nalazi na prvom katu, sastoji se od kuhinje, kupaonice, dnevnog boravka, spavaće sobe,terase i potkrovlja.Terasa je zbog svoje prostranosti i orijentacije (izolirana od pogleda s ulice a otvorena pogledom prema zelenim površinama), dobra strana ovog stana. Stan zahtijeva renovaciju. Velika prednost ove nekretnine je mnoštvo mogućnosti prenamjene postojećeg rasporeda i proširenje na pripadajuće potkrovlje čime bi se dobila veća kvadratura stambene površine.Stan s mnogo potencijala.Poštovani klijenti, agencijska provizija naplaćuje se u skladu s Općim uvjetima poslovanjawww.dux-nekretnine.hr/opci-uvjeti-poslovanjaID KOD AGENCIJE: 963Tomislav TomišaAgent s licencomMob: +385 95 199 2696Tel: +385 51 518 174E-mail: [email protected]www.dux-nekretnine.hr | 1515.15 | 2022-11-14 | Primorsko-goranska |
| 2 | Bakar | Bakar, 90m2, 4-sobni stan s db na samoj rivi | 156000 | 90.00 | U stambenoj zgradi | 3s-3s+DB | U centru Bakra na samoj rivi smještena je ova nekretnina od 90m2 s pogledom na more. Sastoji se od kuhinje s blagovaonicom, dnevnog boravka, tri veće i jedne manje sobe, hodnika, kupaonice te pripadajućeg tavanskog prostora od 75m2 s mogućnošću uređenja u dodatnu manju stambenu jedinicu i dodatnog pomoćnog toaleta. ID KOD AGENCIJE: 23840Željko KalinčevićDirektorMob: +385 91 205 0962Tel: 051 322 376Fax: 051 311 059E-mail: [email protected]http://millennium-nekretnine.hr | 1733.33 | 2022-11-14 | Primorsko-goranska |
| 3 | Bakar | RIJEKA, HRELJIN - Jednosobni s dnevnim boravkom u novogradnji,vrt/tera | 104000 | 47.00 | U stambenoj zgradi | 1s-1s+DB | RIJEKA, HRELJIN - Jednosobni s dnevnim boravkom u novogradnji,vrt/terasa i parkirno mjestoStan površine 47 m2 s vrtom i parkirnim mjestom, smješten u prizemlju.Moderna novogradnja s dvije etaže.Četiri stana u zgradi, uz stan parkirno mjesto.Stanovi u prizemlju imaju vrt/terasu.Zgrada izgrađena, pod krovom, trenutno u fazi roh bau.Oprema stana :-Klima-PVC stolarija s roletama na struju-podno grijanje-protuprovalna vrata-kvalitetna sobna vrata7unutarnja stolarija-keramika 1.klase/laminat (za podnio grijanje ..po odabiru)-walk in kupatilo-kvalitetne renomirane sanitarijeKljuč u ruke!Završetak radova, opremanje i uređenje krajem 2022.godine.Energetski razred AOdlične orijentacije, osunčan od izlaska do zalaska sunca, pun dnevnog svjetla i južnog pogleda jedinstvena je prilika pozicijom, uređenjem i cijenom.Izrazito mali režijski troškovi stanovanja uz veliku blizinu svih potrebnih, a bitnih sadržaja.Definitivno neponovljiva prilika!Nekretnina je smještena u samom centru mjesta te bitnih i poslovnih sadržaja.Ostali sadržaj u pješačkom krugu, škola, vrtić, doktor, dućan..Novogradnja u mirnom i tihom susjedstvu.Okružena zelenilom te manjim zgradama, smještena u slijepoj ulici na odličnoj lokaciji.Odlična prilika za investiciju ili za život te spoj posla i privatnog života!Ne propustite ovu priliku!Poštovani klijenti, agencijska provizija naplaćuje se u skladu s Općim uvjetima poslovanja : www.dux-nekretnine.hr/opci-uvjeti-poslovanjaZa ogled obratite se agentu;Tomislav TomišaLicencirani agent095 199 2 696ID KOD AGENCIJE: 15696Tomislav TomišaAgent s licencomMob: +385 95 199 2696Tel: +385 51 518 174E-mail: [email protected]www.dux-nekretnine.hr | 2212.77 | 2022-11-14 | Primorsko-goranska |
| 4 | Bakar | Škrljevo, etaža kuće sa pripadajućom okućnicom od 300 m2 | 82000 | 93.00 | U stambenoj zgradi | 2s-2s+DB | Škrljevo Etaža kuće, površine 93 m2 sa 300 m2 okućnice. Nalazi se na 1. katu . Sastoji se od dvije spavaće sobe, dnevnog boravka, kuhinje i kupaonice. Stanu pripada i tavanski prostor . Pogled na more, blizina svih sadržaja. Etaža je za uređenje.ID KOD AGENCIJE: 2752Sanda MatoševićOvlašteni posrednikMob: 098 327 619Tel: 051 504 699Fax: 051 504 691E-mail: [email protected]www.consido.hr | 881.72 | 2022-11-14 | Primorsko-goranska |
| 5 | Bakar | Bakar, 2s+db s velikom terasom | 125000 | 73.08 | U stambenoj zgradi | 2s-2s+DB | U centru Bakra prodajemo 2s+db s velikom terasom s koje se pruža pogled na cijeli Bakarski zaljev. Stan je mansardni u visini drugog kata, kompletno adaptiran 2013. godine. Na okućnici zgrade je sojenica s roštiljem. Stanu pripada jedno parkirno mjesto. Za sve informacije nazovite 098/289-093ID KOD AGENCIJE: 17421Goran VagajaMob: 098/289-093Tel: 051/227-733www.kapitalnekretnine.hr | 1710.45 | 2022-11-14 | Primorsko-goranska |
žup_cro <- data.frame(
županija = c(
"Virovitičko-podravska",
"Koprivničko-križevačka",
"Osječko-baranjska",
"Istarska",
"Dubrovačko-neretvanska",
"Sisačko-moslovačka",
"Brodsko-posavska",
"Karlovačka",
"Zadarska",
"Vukovarsko-srijemska",
"Splitsko-dalmatinska",
"Varaždinska",
"Krapinsko-zagorska",
"Zagrebačka",
"Primorsko-goranska",
"Šibensko-kninska",
"Ličko-senjska",
"Bjelovarsko-bilogorska",
"Grad Zagreb",
"Međimurska",
"Požeško-slavonska"
)
)
# prosjecni kvadrat po županiji
avg_cro <- aggregate(kvadrat ~ županija, data = podaci, FUN = mean)
# stand. devijacija
sd_cro <- aggregate(kvadrat ~ županija, data = podaci, FUN = sd)
# koeficijent varijacije po županiji
cv_cro <-
data.frame(županija = avg_cro$županija,
cv = sd_cro$kvadrat / avg_cro$kvadrat)
# broj oglasa po županiji (da vidite broj podataka i odlucimo koliko je "znacajno" za zeleno na karti)
cnt_cro <-
aggregate(lokacija ~ županija, data = podaci, FUN = length)
# merge u fajl koji ima podatke o svakoj županiji
cro_data <-
merge(merge(avg_cro, cv_cro, by = "županija"), cnt_cro, by = "županija")
cro_data <-
merge(žup_cro, cro_data, by = "županija", all.x = TRUE)
names(cro_data) <-
c("županija", "avgKvadrata", "koefVarKvadrata", "brojOglasa") #stupce preimenovat
#brisanje
rm(žup_cro,
avg_cro,
sd_cro,
cv_cro,
cnt_cro)
kable(cro_data)
| županija | avgKvadrata | koefVarKvadrata | brojOglasa |
|---|---|---|---|
| Bjelovarsko-bilogorska | 1106.945 | 0.1647883 | 4 |
| Brodsko-posavska | 1501.212 | 0.3526608 | 40 |
| Dubrovačko-neretvanska | 3484.280 | 0.3857475 | 49 |
| Grad Zagreb | 2799.509 | 0.2730213 | 1566 |
| Istarska | 3211.686 | 0.3448460 | 2097 |
| Karlovačka | 1486.813 | 0.3862668 | 3 |
| Koprivničko-križevačka | NA | NA | NA |
| Krapinsko-zagorska | 1666.701 | 0.2275210 | 8 |
| Ličko-senjska | 2951.229 | 0.3264797 | 60 |
| Međimurska | 1593.333 | 0.1050826 | 3 |
| Osječko-baranjska | 1559.107 | 0.3000016 | 11 |
| Požeško-slavonska | 2923.640 | NA | 1 |
| Primorsko-goranska | 2826.340 | 0.4700586 | 4584 |
| Šibensko-kninska | 2968.267 | 0.2733339 | 427 |
| Sisačko-moslovačka | 2582.590 | 0.0160993 | 2 |
| Splitsko-dalmatinska | 3153.648 | 0.3161823 | 251 |
| Varaždinska | 1948.274 | 0.2116252 | 18 |
| Virovitičko-podravska | NA | NA | NA |
| Vukovarsko-srijemska | 2899.750 | NA | 1 |
| Zadarska | 3230.030 | 0.3514062 | 557 |
| Zagrebačka | 2220.450 | 0.2394800 | 109 |
PITA
# županije sortirane silazno po broju oglasa
cro_data_sorted <- cro_data[order(-cro_data$brojOglasa),]
# Create a new data frame with the top x županija and their corresponding 'brojOglasa' values
x <- 5
top_x_zupanija <- data.frame(županija = cro_data_sorted$županija[1:x],
brojOglasa = cro_data_sorted$brojOglasa[1:x])
# Calculate the total number of 'brojOglasa' for the remaining županija
ostali_brojOglasa <- sum(cro_data_sorted$brojOglasa[x:length(cro_data_sorted$brojOglasa)], na.rm = TRUE)
# Create a new row for the remaining županija with a label 'ostali'
ostali_zupanija <- data.frame(županija = "Ostali", brojOglasa = ostali_brojOglasa)
#skupa
top_x_ostali <- rbind(top_x_zupanija, ostali_zupanija)
PITA
piepercent <- round(100*top_x_ostali$brojOglasa/sum(top_x_ostali$brojOglasa), 1)
piepercent[length(piepercent)] <- round(100 - sum(piepercent[-length(piepercent)]), 1)
pie(piepercent,
labels = paste(top_x_ostali$županija, paste0(piepercent, "%")),
main = "PITA KRUMPIRUŠA",
col = rainbow(length(top_x_ostali$brojOglasa)))
rm(ostali_brojOglasa, ostali_zupanija, x, piepercent)
VIOLINICE
# Create a vector of all županija names
all_zupanije <- unique(cro_data_sorted$županija)
# Get the names of the županije not in top_x_županija
ostale_zupanije <- setdiff(all_zupanije, top_x_zupanija$županija)
# Replace the names of the županije not in top_x_županija with 'Ostali'
podaci_renamed <-
within(podaci, županija[županija %in% ostale_zupanije] <-
'Ostali')
# Convert županija variable to a factor with the desired order
podaci_renamed$županija <-
factor(podaci_renamed$županija, levels = top_x_ostali$županija)
VIOLINICE
# Create the violin plot
ggplot(data = podaci_renamed, aes(x = županija, y = kvadrat, color = županija)) +
geom_violin() +
labs(title = "Violinice",
x = "Županija",
y = "Kvadrat") +
geom_boxplot(width = 0.1) +
guides(color = FALSE)
rm(cro_data_sorted, all_zupanije, ostale_zupanije, podaci_renamed, top_x_ostali, top_x_zupanija)
KARTA I PODACI (CRO)
# karta
cro_map <-
readOGR("/Users/perica/Desktop/matina_sranja", "Croatia_map")
# spajanje tih podataka s kartom u zajednicki fajl
cro_data_map <-
merge(
cro_map,
cro_data,
by.x = "County",
by.y = "županija",
all.x = TRUE
)
cro_data_map <- st_as_sf(cro_data_map) #bolji format
#brisanje
rm(cro_map)
PLOTIRANJE (CRO)
# avg cijena po kv CRO
ggplot(cro_data_map) +
geom_sf(aes(fill = round(avgKvadrata, 2)),
color = "gray",
lwd = 1) +
scale_fill_gradient(
low = "#efedf5",
high = "#3f007d",
#raspon boja županija, opcionalno za boju onih bez podataka ide: na.value = "boja"
breaks = c(1000, 1650, 2250, 2850, 3500),
limits = c(1000, 3500)
) +
theme_void() + #tema da nema rešetki priko karte
labs(title = "Prosječna cijena po kvadratu u Hrvatskoj",
fill = "Cijena po metru kvadratnom (€)",
caption = "Zelene županije - značajna količina podataka\nCrne županije - manja količina podataka") +
geom_sf_label(
aes(label = ifelse(
is.na(avgKvadrata) |
is.null(avgKvadrata),
County,
paste0(County, "\n", "€", sprintf("%.2f", round(avgKvadrata, 2)))
)),
#ako nema podataka, onda samo ime županije
size = 2.5,
#za tekst županija je sve dalje
fontface = "bold",
color = ifelse(
cro_data_map$brojOglasa < 40 |
is.na(cro_data_map$brojOglasa) |
is.null(cro_data_map$brojOglasa),
"black",
"darkgreen"
),
#zeleni imaju znacajno podataka, crni ne
fill = "#F2F3F4",
label.padding = unit(0.15, "lines"),
label.r = unit(0.2, "lines"),
label.size = 0.001
)
# koef var CRO
ggplot(cro_data_map) +
geom_sf(aes(fill = round(koefVarKvadrata * 100, 2)),
color = "gray",
lwd = 1) +
scale_fill_gradient(
low = "#deebf7",
high = "#08306b",
breaks = c(0, 10, 20, 30, 40, 50),
limits = c(0, 50)
) +
theme_void() +
labs(title = "Koeficijent varijacije cijene kvadrata u Hrvatskoj",
fill = "Koeficijent varijacije (%)",
caption = "Zelene županije - značajna količina podataka\nCrne županije - manja količina podataka") +
geom_sf_label(
aes(label = ifelse(
is.na(koefVarKvadrata) |
is.null(koefVarKvadrata) ,
County,
paste0(County, "\n", sprintf("%.2f", round(koefVarKvadrata, 2) * 100), "%")
)),
size = 2.5,
fontface = "bold",
color = ifelse(
cro_data_map$brojOglasa < 40 |
is.na(cro_data_map$brojOglasa) |
is.null(cro_data_map$brojOglasa),
"black",
"darkgreen"
),
fill = "#F2F3F4",
label.padding = unit(0.15, "lines"),
label.r = unit(0.2, "lines"),
label.size = 0.001
)
rm(cro_data_map)
KARTA I PODACI (ZG)
kvart_zg <-
data.frame(
lokacija = c(
"Brezovica",
"Črnomerec",
"Donja Dubrava",
"Donji Grad",
"Gornja Dubrava",
"Gornji Grad - Medveščak",
"Maksimir",
"Novi Zagreb - Istok",
"Novi Zagreb - Zapad",
"Pešćenica - Žitnjak",
"Podsljeme",
"Podsused - Vrapče",
"Sesvete",
"Stenjevec",
"Trešnjevka - Jug",
"Trešnjevka - Sjever",
"Trnje",
"Zagreb - Okolica"
)
)
# izdvojimo kvartove
zg_data <-
subset(podaci,
županija == "Grad Zagreb",
select = c("lokacija", "kvadrat"))
# prosjecni kvadrat po kvartovima zga
avg_zg <- aggregate(kvadrat ~ lokacija, data = zg_data, FUN = mean)
# stand. devijacija
sd_zg <- aggregate(kvadrat ~ lokacija, data = zg_data, FUN = sd)
# koeficijent varijacije po kvartovima zga
cv_zg <-
data.frame(lokacija = avg_zg$lokacija,
cv = sd_zg$kvadrat / avg_zg$kvadrat)
# broj oglasa po kvartovima zga (da vidite broj podataka i odlucimo koliko je "znacajno" za zeleno na karti)
cnt_zg <-
aggregate(kvadrat ~ lokacija, data = zg_data, FUN = length)
# merge u fajl koji ima podatke o svakoj županiji
zg_data <-
merge(merge(avg_zg, cv_zg, by = "lokacija"), cnt_zg, by = "lokacija")
zg_data <-
merge(kvart_zg, zg_data, by = "lokacija", all.x = TRUE)
names(zg_data) <-
c("lokacija", "avgKvadrata", "koefVarKvadrata", "brojOglasa") #stupce preimenovat
# karta
zg_map <-
readOGR("/Users/perica/Desktop/matina_sranja", "Zagreb_map")
# spajanje tih podataka s kartom u zajednicki fajl
zg_data_map <-
merge(zg_map,
zg_data,
by.x = "District",
by.y = "lokacija",
all.x = TRUE)
zg_data_map <- st_as_sf(zg_data_map) #pogodniji format
#brisanje
rm(zg_data,
kvart_zg,
avg_zg,
sd_zg,
cv_zg,
cnt_zg,
zg_map)
PLOTIRANJE (ZG)
# avg cijena po kv ZG
ggplot(zg_data_map) +
geom_sf(aes(fill = round(avgKvadrata, 2)),
color = "gray",
lwd = 1) +
scale_fill_gradient(
low = "#fcfbfd",
high = "#3f007d",
#raspon boja kvartova
breaks = c(2000, 2500, 3000, 3500),
limits = c(2000, 3500)
) +
theme_void() + #tema da nema rešetki priko karte
labs(title = "Prosječna cijena po kvadratu u Zagrebu",
fill = "Cijena po metru kvadratnom (€)",
caption = "Zeleni kvartovi - značajna količina podataka\nCrni kvartovi - manja količina podataka") +
geom_sf_label(
aes(label = ifelse(
is.na(avgKvadrata) |
is.null(avgKvadrata),
District,
paste0(District, "\n", "€", sprintf("%.2f", round(avgKvadrata, 2)))
)),
#ako nema podataka, onda samo ime županije
size = 2.5,
#za tekst kvartova je sve dalje
fontface = "bold",
color = ifelse(
zg_data_map$brojOglasa < 80 |
is.na(zg_data_map$brojOglasa) |
is.null(zg_data_map$brojOglasa),
"black",
"darkgreen"
),
#zeleni imaju znacajno podataka, crni ne
fill = "#F2F3F4",
label.padding = unit(0.15, "lines"),
label.r = unit(0.2, "lines"),
label.size = 0.001
)
# koef var ZG
ggplot(zg_data_map) +
geom_sf(aes(fill = round(koefVarKvadrata * 100, 2)),
color = "gray",
lwd = 1) +
scale_fill_gradient(
low = "#deebf7",
high = "#08306b",
breaks = c(0, 10, 20, 30, 40),
limits = c(0, 40)
) +
theme_void() +
labs(title = "Koeficijent varijacije cijene kvadrata u Zagrebu",
fill = "Koeficijent varijacije (%)",
caption = "Zeleni kvartovi - značajna količina podataka\nCrni kvartovi - manja količina podataka") +
geom_sf_label(
aes(label = ifelse(
is.na(koefVarKvadrata) |
is.null(koefVarKvadrata),
District,
paste0(District, "\n", sprintf("%.2f", round(koefVarKvadrata, 2) * 100), "%")
)),
size = 2.5,
fontface = "bold",
color = ifelse(
zg_data_map$brojOglasa < 80 |
is.na(zg_data_map$brojOglasa) |
is.null(zg_data_map$brojOglasa),
"black",
"darkgreen"
),
fill = "#F2F3F4",
label.padding = unit(0.15, "lines"),
label.r = unit(0.2, "lines"),
label.size = 0.001
)
rm(zg_data_map,cro_data)
REGRESIJA
### graf cijenje i kvadrature svih oglasa (kontrolni graf) ###
p3<-ggplot(podaci, aes(y = cijena, x = kvadratura )) +
geom_point(shape=18, color="deepskyblue3")+
geom_smooth(method=lm, se=FALSE,
color="black") +
coord_cartesian(ylim = c(20000, 250000),
xlim = c(15,120), expand = FALSE) +
ylab("Cijena stana") +
xlab("Kvadratura") +
ggtitle("Cijena po m2") +
theme(axis.text = element_text(size = 16),
axis.title = element_text(size = 20, face = "bold"),
axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
margin = margin(t = 0, r = 0, b = 20, l = 0)),
strip.background = element_rect(colour = "black", fill = "white"),
strip.text = element_text(face = "bold", size = 16))
p3 #prokaz grafa
model <- lm(cijena ~ kvadratura, data = podaci) #definiram regresiju
summary(model) #prokaz koeficjenata
##
## Call:
## lm(formula = cijena ~ kvadratura, data = podaci)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1119718 -59443 -15168 33382 1713609
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5241.66 3101.92 1.69 0.0911 .
## kvadratura 2856.40 32.86 86.92 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 131500 on 9789 degrees of freedom
## Multiple R-squared: 0.4356, Adjusted R-squared: 0.4356
## F-statistic: 7556 on 1 and 9789 DF, p-value: < 2.2e-16
rm(model,p3) #brisanje varijabli
INDEXI
B=1 #B je koji ces bazni index da ti bude
#definiram vektore za spremanje
cjene = c()
velicina = c()
mjesec = c()
#za cjene iz 2022
filter=subset(podaci, year(podaci$datumi)==2022)
for(i in 4:12){
mjesec = append(mjesec,paste(as.numeric(i),"/","2022",sep="",collapse=NULL))
filter2=subset(filter,month(filter$datumi)==i)
velicina=append(velicina,length(filter2$kvadrat))
cjene = append(cjene,mean(filter2$kvadrat))
}
# za cjene iz 2023
filter=subset(podaci, year(podaci$datumi)==2023)
for(i in 1:3){
mjesec = append(mjesec,paste(as.numeric(i),"/","2023",sep="",collapse=NULL))
filter2=subset(filter,month(filter$datumi)==i)
velicina=append(velicina,length(filter2$kvadrat))
cjene = append(cjene,mean(filter2$kvadrat))
}
#racunam indekse
cjeneB=(cjene/cjene[B])*100
#kreiram tablicu
tablica=data.frame(cjene,cjeneB,velicina,mjesec)
Q=tablica #za tablicu
#samo misece probacijen u tip datuma
tablica$mjesec <- as.Date(paste0("01/", tablica$mjesec), format = "%d/%m/%Y")
# Prikaz indexa (komentirat s deckima ocemo maknit ili ostavit ovu mracnu liniju)
index <- ggplot(tablica, aes(x=mjesec, y=cjene)) +
geom_line(size = 1.5, color = "red") +
geom_point(color = "black") +
geom_smooth(method = "lm", se = TRUE, level=0.95)+
scale_y_continuous(breaks = seq(2800,3500,100)) +
scale_x_date(date_breaks = "2 months") +
ylab("Cijena kvadrata u €") +
xlab("") +
ggtitle("Cijene stanova dataseta po datumu") +
theme(axis.text = element_text(size = 16),
axis.title = element_text(size = 20),
axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
margin = margin(t = 0, r = 0, b = 20, l = 0)),
strip.background = element_rect(colour = "black", fill = "white"),
strip.text = element_text(face = "bold", size = 16))
theme_linedraw()
index #prikaz grfa
#koef korelacije
paste("Koeficjent koorelacije je:",as.character(cor(cjene,c(1:12))))
## [1] "Koeficjent koorelacije je: 0.801755608917857"
#moja regresija
model <- lm(cjene ~ c(1:12), data = tablica)
summary(model)
##
## Call:
## lm(formula = cjene ~ c(1:12), data = tablica)
##
## Residuals:
## Min 1Q Median 3Q Max
## -170.760 -40.418 -7.156 14.160 212.524
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2734.295 62.591 43.685 9.49e-13 ***
## c(1:12) 36.077 8.504 4.242 0.00171 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 101.7 on 10 degrees of freedom
## Multiple R-squared: 0.6428, Adjusted R-squared: 0.6071
## F-statistic: 18 on 1 and 10 DF, p-value: 0.00171
Q #prikaz tablice
## cjene cjeneB velicina mjesec
## 1 2891.322 100.00000 29 4/2022
## 2 2811.406 97.23600 102 5/2022
## 3 2842.811 98.32218 81 6/2022
## 4 2860.103 98.92024 63 7/2022
## 5 2954.888 102.19848 49 8/2022
## 6 2920.485 101.00863 1732 9/2022
## 7 2816.078 97.39756 453 10/2022
## 8 2952.067 102.10091 4466 11/2022
## 9 3044.397 105.29429 968 12/2022
## 10 3015.653 104.30013 1267 1/2023
## 11 3136.625 108.48411 92 2/2023
## 12 3379.749 116.89286 17 3/2023
#rjesavanje varijabli
rm(B,cjeneB,cjene,i,mjesec,velicina,filter,filter2,index,model,tablica,Q)
##RIJEČI
###analiza broja rici
# Stvaranje novog stupca gdje ce pisati broj rijeci u oglasu za svaki opis
podaci$br_rijeci = NA
opis=podaci$opis
for (x in 1:length(podaci$naslov)) {
my_string <- opis[x]
podaci$br_rijeci[x] <- length(strsplit(as.character(my_string), "\\w+")[[1]])
}
rm(x,my_string)
# Filtriranje podatka
filtrirani_podaci <- podaci %>%
filter(br_rijeci >=50 & br_rijeci <=600, kvadrat >=1000 & kvadrat <= 8000)
# Prikaz korelacije
p1<-ggplot(filtrirani_podaci, aes(y = kvadrat, x = br_rijeci )) +
geom_point(shape=18, color="deepskyblue3")+
geom_smooth(method=lm, se=FALSE,
color="black") +
ylab("Cijena po m2") +
xlab("Broj riječi u oglasu") +
ggtitle("Utjecaj broja riječi na cijenu kvadrata stana") +
theme(axis.text = element_text(size = 16),
axis.title = element_text(size = 20, face = "bold"),
axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
margin = margin(t = 0, r = 0, b = 20, l = 0)),
strip.background = element_rect(colour = "black", fill = "white"),
strip.text = element_text(face = "bold", size = 16))
p1
rm(p1)
# Linearna regresija za analizu
summary(lm(kvadrat~ br_rijeci, filtrirani_podaci))
##
## Call:
## lm(formula = kvadrat ~ br_rijeci, data = filtrirani_podaci)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2637.4 -741.2 -192.0 502.0 5168.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2523.9676 22.4510 112.42 <2e-16 ***
## br_rijeci 2.5116 0.1151 21.82 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1075 on 9151 degrees of freedom
## Multiple R-squared: 0.04945, Adjusted R-squared: 0.04934
## F-statistic: 476 on 1 and 9151 DF, p-value: < 2.2e-16
rm(filtrirani_podaci)
cor.test(podaci$br_rijeci, podaci$kvadrat, alternative = "greater")
##
## Pearson's product-moment correlation
##
## data: podaci$br_rijeci and podaci$kvadrat
## t = 23.044, df = 9789, p-value < 2.2e-16
## alternative hypothesis: true correlation is greater than 0
## 95 percent confidence interval:
## 0.2110071 1.0000000
## sample estimates:
## cor
## 0.2268355
####### trazenje najfrekventnijih rijeci #######
#Novi vektor gdje ce se nalaziti sve rijeci iz svih opisa
v = character()
for (y in 1:length(podaci$naslov)) {
a=strsplit(str_squish(gsub("[^[:alpha:]]"," ",opis[y]))," ")
v=c(v,a)
}
rm(y,a)
# Stvaranje Corpusa
text_podaci<-Corpus(VectorSource(v))
rm(v)
# Čišćenje Corpusa
text_1<-tm_map(text_podaci, removeNumbers)
text_1<-tm_map(text_podaci, removePunctuation)
rm(text_podaci)
# Stvaranje matrice za analizu
dtm<- TermDocumentMatrix(text_1)
m<-as.matrix(dtm)
k<-sort(rowSums(m), decreasing = TRUE)
word_freq <- data.frame(word = names(k), frequency = k)
kable(word_freq[1:25,])
| word | frequency | |
|---|---|---|
| stan | stan | 22352 |
| 11163 | ||
| protected | protected | 11074 |
| kod | kod | 9771 |
| 9308 | ||
| www | www | 9013 |
| nalazi | nalazi | 8942 |
| sobe | sobe | 8940 |
| agencije | agencije | 8798 |
| tel | tel | 8130 |
| sastoji | sastoji | 8124 |
| nekretnine | nekretnine | 7680 |
| spavaće | spavaće | 7037 |
| zgrade | zgrade | 6386 |
| površine | površine | 6347 |
| ima | ima | 6233 |
| dnevnog | dnevnog | 5864 |
| boravka | boravka | 5682 |
| katu | katu | 5361 |
| dvije | dvije | 5336 |
| stana | stana | 5139 |
| kuhinje | kuhinje | 5112 |
| kupaonice | kupaonice | 5111 |
| dux | dux | 4409 |
| grijanje | grijanje | 4356 |
rm(dtm,m,k,text_1)
#stavranje stupaca
podaci$more = NA
podaci$parkirno = NA
podaci$prizemlje = NA
podaci$terasa = NA
#stvaranje vektora gdje
da_more = vector()
ne_more = vector()
da_parking = vector()
ne_parking = vector()
da_prizemlje = vector()
ne_prizemlje = vector()
da_terasa = vector()
ne_terasa = vector()
for (i in 1:length(podaci$naslov)) {
string_opis = opis[i]
string_opis = tolower(string_opis)
if (grepl("\\bmor[[:alpha:]]\\b",string_opis)) {
podaci$more[i] = 1
da_more=c(da_more,podaci$kvadrat[i])
} else {
podaci$more[i] = 0
ne_more=c(ne_more,podaci$kvadrat[i])
}
if (grepl("\\bparkir[[:alpha:]]*\\b",string_opis)) {
podaci$parkirno[i] = 1
da_parking=c(da_parking,podaci$kvadrat[i])
} else {
podaci$parkirno[i] = 0
ne_parking=c(ne_parking,podaci$kvadrat[i])
}
if (grepl("\\bprizem[[:alpha:]]*\\b",string_opis)) {
podaci$prizemlje[i] = 1
da_prizemlje=c(da_prizemlje,podaci$kvadrat[i])
} else {
podaci$prizemlje[i] = 0
ne_prizemlje=c(ne_prizemlje,podaci$kvadrat[i])
}
if (grepl("\\bteras[[:alpha:]]*\\b",string_opis)) {
podaci$terasa[i] = 1
da_terasa=c(da_terasa,podaci$kvadrat[i])
} else {
podaci$terasa[i] = 0
ne_terasa=c(ne_terasa,podaci$kvadrat[i])
}
}
rm(i,string_opis,opis)
###Filtriranje data seta
df.1 <- podaci %>%
filter(cijena >=20000 & cijena <=250000, kvadratura >=20 & kvadratura <= 120) %>%
mutate(more_1 = case_when(more == "1" ~ "Stan je blizu mora",
more == "0" ~ "Stan nije blizu mora")) %>%
mutate(prizemlje_1 = case_when(prizemlje == "1" ~ "Stan je u prizemlju",
prizemlje == "0" ~ "Stan nije u prizemlju")) %>%
mutate(parkirno_1 = case_when(parkirno == "1" ~ "Stan ima parking",
parkirno == "0" ~ "Stan nema parking")) %>%
mutate(terasa_1 = case_when(terasa == "1" ~ "Stan ima terasu",
terasa == "0" ~ "Stan nema terasu"))
###Regresijski grafovi kada u opisu je rijec more i kada nije
p4<-ggplot(df.1, aes(y = cijena, x = kvadratura )) +
geom_point(shape=18, color="deepskyblue3")+
geom_smooth(method=lm, se=FALSE,
color="black") +
scale_x_continuous(breaks = seq(20,120,15)) +
facet_grid(~more_1) +
ylab("Cijena stana") +
xlab("Kvadratura") +
ggtitle("Cijena po m2") +
theme(axis.text = element_text(size = 16),
axis.title = element_text(size = 20, face = "bold"),
axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
margin = margin(t = 0, r = 0, b = 20, l = 0)),
strip.background = element_rect(colour = "black", fill = "white"),
strip.text = element_text(face = "bold", size = 16))
p4
rm(p4)
#test razlike sredina kod rijeci more
t.test(da_more, ne_more)
##
## Welch Two Sample t-test
##
## data: da_more and ne_more
## t = 30.98, df = 7227.8, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 693.1125 786.7513
## sample estimates:
## mean of x mean of y
## 3349.306 2609.374
p5<-ggplot(df.1, aes(y = cijena, x = kvadratura )) +
geom_point(shape=18, color="darkgreen")+
geom_smooth(method=lm, se=FALSE,
color="black") +
scale_x_continuous(breaks = seq(20,120,15)) +
facet_grid(~parkirno_1) +
ylab("Cijena stana") +
xlab("Kvadratura") +
ggtitle("Cijena po m2") +
theme(axis.text = element_text(size = 16),
axis.title = element_text(size = 20, face = "bold"),
axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
margin = margin(t = 0, r = 0, b = 20, l = 0)),
strip.background = element_rect(colour = "black", fill = "white"),
strip.text = element_text(face = "bold", size = 16))
p5
rm(p5)
#test razlike sredina kod rijeci parkirno
t.test(da_parking, ne_parking)
##
## Welch Two Sample t-test
##
## data: da_parking and ne_parking
## t = 17.153, df = 9761.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 355.9803 447.8413
## sample estimates:
## mean of x mean of y
## 3135.240 2733.329
p6<-ggplot(df.1, aes(y = cijena, x = kvadratura )) +
geom_point(shape=18, color="firebrick")+
geom_smooth(method=lm, se=FALSE,
color="black") +
scale_x_continuous(breaks = seq(20,120,15)) +
facet_grid(~prizemlje_1) +
ylab("Cijena stana") +
xlab("Kvadratura") +
ggtitle("Cijena po m2") +
theme(axis.text = element_text(size = 16),
axis.title = element_text(size = 20, face = "bold"),
axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
margin = margin(t = 0, r = 0, b = 20, l = 0)),
strip.background = element_rect(colour = "black", fill = "white"),
strip.text = element_text(face = "bold", size = 16))
p6
rm(p6)
#test razlike sredina kod rijeci prizemlje
t.test(da_prizemlje, ne_prizemlje)
##
## Welch Two Sample t-test
##
## data: da_prizemlje and ne_prizemlje
## t = 6.388, df = 6122.1, p-value = 1.805e-10
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 112.0474 211.2667
## sample estimates:
## mean of x mean of y
## 3039.271 2877.614
p7<-ggplot(df.1, aes(y = cijena, x = kvadratura )) +
geom_point(shape=18, color="darkturquoise")+
geom_smooth(method=lm, se=FALSE,
color="black") +
scale_x_continuous(breaks = seq(20,120,15)) +
facet_grid(~terasa_1) +
ylab("Cijena stana") +
xlab("Kvadratura") +
ggtitle("Cijena po m2") +
theme(axis.text = element_text(size = 16),
axis.title = element_text(size = 20, face = "bold"),
axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
margin = margin(t = 0, r = 0, b = 20, l = 0)),
strip.background = element_rect(colour = "black", fill = "white"),
strip.text = element_text(face = "bold", size = 16))
p7
rm(p7)
#test razlike sredina kod rijeci parkirno
t.test(da_terasa, ne_terasa)
##
## Welch Two Sample t-test
##
## data: da_terasa and ne_terasa
## t = 22.942, df = 7505.8, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 510.7113 606.1426
## sample estimates:
## mean of x mean of y
## 3256.809 2698.382
rm(list = ls.str(mode = 'numeric'))
m3<-lm(cijena~kvadratura + more,df.1)
m4<-lm(cijena~kvadratura + prizemlje,df.1)
m5<-lm(cijena~kvadratura + terasa,df.1)
m6<-lm(cijena~kvadratura + parkirno,df.1)
stargazer(list(m3,m4,m5,m6), type = "text")
##
## =======================================================================================
## Dependent variable:
## -------------------------------------------------------
## cijena
## (1) (2) (3) (4)
## ---------------------------------------------------------------------------------------
## kvadratura 1,169.458*** 1,166.349*** 1,135.537*** 1,147.860***
## (23.897) (24.296) (23.837) (23.525)
##
## more 16,955.440***
## (1,023.623)
##
## prizemlje 8,719.894***
## (1,082.961)
##
## terasa 18,903.650***
## (1,045.963)
##
## parkirno 21,229.690***
## (966.586)
##
## Constant 78,454.120*** 81,924.930*** 80,636.220*** 76,535.190***
## (1,711.990) (1,734.375) (1,677.279) (1,684.735)
##
## ---------------------------------------------------------------------------------------
## Observations 6,215 6,215 6,215 6,215
## R2 0.298 0.274 0.303 0.320
## Adjusted R2 0.298 0.274 0.303 0.319
## Residual Std. Error (df = 6212) 38,355.410 38,990.360 38,201.820 37,754.760
## F Statistic (df = 2; 6212) 1,317.551*** 1,174.651*** 1,353.192*** 1,459.421***
## =======================================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
rm(m3,m4,m5,m6,df.1)